/**
 * @file iec104_controller_config.h
 * @brief IEC 104协议控制器配置管理模块
 * @details 加载和管理IEC 104控制器应用的配置参数
 * 
 * @author zyb
 * @date 2025-10-30
 * @version 1.0
 */

#ifndef IEC104_CONTROLLER_CONFIG_H
#define IEC104_CONTROLLER_CONFIG_H

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 配置结构定义 ==================== */

/**
 * @brief IEC 104控制器配置结构
 */
typedef struct {
    /* TCP连接配置 */
    char device_ip[64];                 /* 104设备IP地址 */
    uint16_t device_port;               /* 104设备端口 */
    int connect_timeout;                /* 连接超时时间(秒) */
    
    /* APDU参数 */
    int t1_timeout;                     /* T1超时时间(秒) - 等待确认超时 */
    int t2_timeout;                     /* T2超时时间(秒) - 等待应答超时 */
    int t3_heartbeat;                   /* T3心跳时间(秒) - 无数据传输时的测试帧间隔 */
    int k_send_max;                     /* k值 - 最大未确认发送APDU数量 */
    int w_receive_max;                  /* w值 - 最大未确认接收APDU数量 */
    
    /* ASDU参数 */
    int common_address;                 /* 公共地址(ASDU地址) */
    int cause_size;                     /* 传输原因字节数(1或2) */
    int asdu_addr_size;                 /* ASDU地址字节数(1或2) */
    int ioa_size;                       /* 信息对象地址字节数(1, 2或3) */
    
} iec104_controller_config_t;

/* ==================== 函数声明 ==================== */

/**
 * @brief 加载IEC 104控制器配置
 * @details 从配置文件加载控制器配置参数
 * 
 * @param config 配置结构指针
 * @param config_file 配置文件路径
 * @return 0表示成功，-1表示失败
 */
int iec104_controller_config_load(iec104_controller_config_t* config, const char* config_file);

/**
 * @brief 打印IEC 104控制器配置
 * @details 打印控制器配置信息到日志
 * 
 * @param config 配置结构指针
 */
void iec104_controller_config_print(const iec104_controller_config_t* config);

/**
 * @brief 验证IEC 104控制器配置
 * @details 验证配置参数的有效性
 * 
 * @param config 配置结构指针
 * @return 0表示配置有效，-1表示配置无效
 */
int iec104_controller_config_validate(const iec104_controller_config_t* config);

#ifdef __cplusplus
}
#endif

#endif /* IEC104_CONTROLLER_CONFIG_H */

